﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Sauces.Bussinees.Entities.Almacen;
using Sauces.Bussinees.Entities.Ventas;
using Sauces.Bussinees.Logic.Service;
using Sauces.Bussinees.Logic.Ventas;
using Microsoft.Practices.Unity;
using System.Web.ModelBinding;

namespace Sauces.Web.Ventas
{
    public partial class FrmNotaPedido : System.Web.UI.Page
    {
        [Dependency]
        public IProductoService productoService { get; set; }

        [Dependency]
        public INotaPedidoService NotaPedidoService { get; set; }

        private const string KeyNota = "nota";

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                var opc = Request.QueryString["opc"];
                var IdNota = Request.QueryString["id"]; 


                if (opc != null && opc == "new")
                {
                    var nuevaNota = new NotaPedido()
                    {

                        Fecha = DateTime.Now,

                    };

                    BindingNota(nuevaNota);
                    ViewState["opc"] = opc;
                }
                else if (opc != null && opc == "editar" && IdNota != null)
                {
                    var nota = NotaPedidoService.GetAllFromNotaPedidoById(Int32.Parse(IdNota.ToString()));

                    BindingNota(nota);
                    ViewState["opc"] = opc;
                }

                else if (opc != null && opc == "detalle" && IdNota != null)
                {
                    var nota = NotaPedidoService.GetAllFromNotaPedidoById(Int32.Parse(IdNota.ToString()));

                    btnBuscar.Visible = false;
                    upProductos.Visible = false;
                    btnGuardar.Visible = false;
                    

                    BindingNota(nota);
                    ViewState["opc"] = opc;
                }

            }
        }

        private void BindingNota(NotaPedido nuevaNota)
        {
            Cache.Insert(KeyNota, nuevaNota);

            txtId .Text = nuevaNota.Id.ToString();
            txtFecha.Text = nuevaNota.Fecha.ToShortDateString();

            nuevaNota.Total = nuevaNota.DetalleNotaPedido.Sum(dp => dp.Monto);


            Cache.Insert(KeyNota, nuevaNota);

            lvDetalleNota.DataSource = nuevaNota.DetalleNotaPedido;
            lvDetalleNota.DataBind();

            var lblTotal = lvDetalleNota.FindControl("lblTotal") as Label;


            if (lblTotal != null)
            {
                lblTotal.Text = nuevaNota.Total.ToString();
            }
        }

        public IEnumerable<Producto> GetProductos([Control("txtNombre")]string criterio)
        {

            return productoService.getAllProductoByNombre(criterio);
        }

        protected void lvProducto_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "AddDetalle")
            {
                var productoId = Int32.Parse(e.CommandArgument.ToString());

                var nota = GetNotaPedido();

                var existe = nota.DetalleNotaPedido.Where(dp => dp.IdProducto == productoId).SingleOrDefault();
                if (existe != null)
                {
                    existe.Cantidad += 1;
                }

                else
                {
                    var producto = productoService.getFromProductoById(productoId);

                    var newDetalle = new DetalleNotaPedido()
                    {
                        IdNotaPedido = nota.Id,
                        IdProducto = producto.Id,
                        Producto = producto,
                        Precio = producto.PVenta,
                        Cantidad = 1

                    };


                    nota.DetalleNotaPedido.Add(newDetalle);
                }

                BindingNota(nota);
            }
        }

        private NotaPedido GetNotaPedido()
        {
            return Cache.Get(KeyNota) as NotaPedido;
        }

        protected void lvDetalleNota_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "QuitarDetalle")
            {
                var idProducto = Int32.Parse(e.CommandArgument.ToString());

                var boleta = GetNotaPedido();

                var detalle = boleta.DetalleNotaPedido.Where(dp => dp.IdProducto == idProducto).SingleOrDefault();

                if (detalle != null)
                    boleta.DetalleNotaPedido.Remove(detalle);

                BindingNota(boleta);
            }
            else if (e.CommandName == "ActualizarDetalle")
            {
                var boleta = GetNotaPedido();

                foreach (var row in lvDetalleNota.Items)
                {
                    var txtCantidad = row.FindControl("txtCantidad") as TextBox;
                    var txtPrecio = row.FindControl("txtPrecio") as TextBox;

                    boleta.DetalleNotaPedido.ToList()[row.DisplayIndex].Cantidad = decimal.Parse(txtCantidad.Text);
                    boleta.DetalleNotaPedido.ToList()[row.DisplayIndex].Precio = decimal.Parse(txtPrecio.Text);
                }

                BindingNota(boleta);
            }
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            var nota = GetNotaPedido();
            nota.Fecha = DateTime.Parse(txtFecha.Text);


            if (nota != null)
            {
                if (ViewState["opc"].ToString() == "new")
                {
                    NotaPedidoService.addNotaPedido(nota);
                    Response.Redirect("FrmListaNotaPedido.aspx");
                }

                else if (ViewState["opc"].ToString() == "editar")
                {
                    NotaPedidoService.upDateNotaPedido(nota);
                    Response.Redirect("FrmListaNotaPedido.aspx");
                }
            }
        }

    }
}